package cn.wolfcode.wolf2w.controller;

import cn.wolfcode.wolf2w.domain.Destination;
import cn.wolfcode.wolf2w.domain.Strategy;
import cn.wolfcode.wolf2w.domain.Travel;
import cn.wolfcode.wolf2w.domain.UserInfo;
import cn.wolfcode.wolf2w.search.domain.DestinationEs;
import cn.wolfcode.wolf2w.search.domain.StrategyEs;
import cn.wolfcode.wolf2w.search.domain.TravelEs;
import cn.wolfcode.wolf2w.search.domain.UserInfoEs;
import cn.wolfcode.wolf2w.search.query.SearchQueryObject;
import cn.wolfcode.wolf2w.search.service.ISearchService;
import cn.wolfcode.wolf2w.search.service.ITravelEsService;
import cn.wolfcode.wolf2w.search.vo.SearchResultVo;
import cn.wolfcode.wolf2w.service.IDestinationService;
import cn.wolfcode.wolf2w.service.IStrategyService;
import cn.wolfcode.wolf2w.service.ITravelService;
import cn.wolfcode.wolf2w.service.IUserInfoService;
import cn.wolfcode.wolf2w.util.JsonResult;
import cn.wolfcode.wolf2w.util.ParamMap;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@RestController
public class SearchController {

    @Autowired
    private IDestinationService destinationService;
    @Autowired
    private IStrategyService strategyService;
    @Autowired
    private ITravelService travelService;
    @Autowired
    private IUserInfoService userInfoService;
    @Autowired
    private ISearchService searchService;


    @GetMapping("/q")
    public  Object search(SearchQueryObject qo) throws UnsupportedEncodingException {
        //url转中文 会自动将中文进行编码 此时需要转码
        String kw = URLDecoder.decode(qo.getKeyword(), "UTF-8");
        qo.setKeyword(kw);


        switch (qo.getType()){
            case SearchQueryObject.TYPE_DEST:
            return searchDest(qo);
            case SearchQueryObject.TYPE_STRATEGY:
                return searchStrategy(qo);
            case SearchQueryObject.TYPE_TRAVEL:
                return searchTravel(qo);
            case SearchQueryObject.TYPE_USER:
                return searchUser(qo);
            default:
                return searchAll(qo);
        }

    }
    //查目的地
    private Object searchDest(SearchQueryObject qo) {
        //查询输入keyword是不是目的地
        Destination dest =  destinationService.queryName(qo.getKeyword());
        //如果是 查询改目的地下所有攻略 游记 用户
        //result  ---total strategy travels users
        SearchResultVo vo = new SearchResultVo();
        if (dest != null){
             //攻略
            List<Strategy> sts = strategyService.queryByDestName(qo.getKeyword());
            vo.setStrategys(sts);
            //游记
            List<Travel> ts = travelService.queryByDestName(qo.getKeyword());
            vo.setTravels(ts);
            //用户
            List<UserInfo> us = userInfoService.queryCity(qo.getKeyword());
            vo.setUsers(us);

            long total = sts.size()+ts.size()+us.size();
            vo.setTotal(total);
        }

        //qo
        //dest


        return JsonResult.success(new ParamMap()
                .put("result",vo)
                .put("qo",qo)
                .put("dest",dest));
    }

    //查所有
    private Object searchAll(SearchQueryObject qo) {

        SearchResultVo vo = new SearchResultVo();
        long total = 0L;//搜索结果的总条数

        Page<Strategy> sts = this.createStrategyPage(qo);
        vo.setStrategys(sts.getContent());
        total +=sts.getTotalElements();//攻略分页的总记录数

        Page<Travel> ts = this.createTravelPage(qo);
        vo.setTravels(ts.getContent());
        total +=ts.getTotalElements();

        Page<UserInfo> us = this.createUserInfoPage(qo);
        vo.setUsers(us.getContent());
        total +=us.getTotalElements();

        Page<Destination> ds = this.createDestPage(qo);
        vo.setDests(ds.getContent());
        total +=ds.getTotalElements();

        vo.setTotal(total);


        return JsonResult.success(new ParamMap()
                .put("result",vo)
                .put("qo",qo)
        );
    }

    //查用户
    private Object searchUser(SearchQueryObject qo) {
        //通过关键词进行全文搜索(结局需要高亮显示)
        //qo
        //dest


        return JsonResult.success(new ParamMap()
                .put("page",this.createUserInfoPage(qo))
                .put("qo",qo)

        );
    }

    //查游记
    private Object searchTravel(SearchQueryObject qo) {
        //通过关键词进行全文搜索(结局需要高亮显示)
        //qo
        //dest


        return JsonResult.success(new ParamMap()
                .put("page",this.createTravelPage(qo))
                .put("qo",qo)
        );
    }


    //查攻略
    private Object searchStrategy(SearchQueryObject qo) {
        //通过关键词进行全文搜索(结局需要高亮显示)

        //qo
        //dest


        return JsonResult.success(new ParamMap()
                .put("page",this.createStrategyPage(qo))
                .put("qo",qo)
        );
    }

    private Page<Strategy> createStrategyPage(SearchQueryObject qo){
        Page<Strategy> sts = searchService.searchWithHighlight(StrategyEs.INDEX_NAME, StrategyEs.TYPE_NAME, Strategy.class,
                qo, "title", "subTitle", "summary");
        return  sts;
    }
    private Page<Travel> createTravelPage(SearchQueryObject qo){
        return  searchService.searchWithHighlight(TravelEs.INDEX_NAME,
                TravelEs.TYPE_NAME, Travel.class, qo, "title", "summary");
    }
    private Page<UserInfo> createUserInfoPage(SearchQueryObject qo){
        return  searchService.searchWithHighlight(UserInfoEs.INDEX_NAME,
                UserInfoEs.TYPE_NAME, UserInfo.class, qo, "info", "city");
    }
    private Page<Destination> createDestPage(SearchQueryObject qo){
        return  searchService.searchWithHighlight(DestinationEs.INDEX_NAME,
                DestinationEs.TYPE_NAME, Destination.class, qo, "name", "info");
    }


}
